import { getUserInfoAPI, loginAPI } from "@/apis/user";
import { getToken, removeToken, setToken as _setToken } from "@/utils/token";
import { createSlice } from "@reduxjs/toolkit";

const userStore = createSlice({
  // 仓库唯一标识
  name: "user",
  // 初始化数据
  initialState: {
    // 本地存储中如果没有token就设置为空字符串
    token: getToken() || "",
    // 用户信息
    userInfo: {},
  },
  // 同步修改方法
  reducers: {
    // 修改token的同步方法(store + localStorage)
    setToken(state, action) {
      // action.payload：调用setToken actionCreater传递的参数
      state.token = action.payload;
      // 将token存储到本地存储中
      _setToken(action.payload);
    },
    // 修改用户信息的同步方法
    setUserInfo(state, action) {
      state.userInfo = action.payload;
    },
    // 清除用户信息的同步方法
    clearUserInfo(state) {
      // 清除仓库中的用户信息和token
      state.userInfo = {};
      state.token = "";
      // 清除本地存储中的token
      removeToken();
    },
  },
});

// 解构出actionCreater
const { setToken, setUserInfo, clearUserInfo } = userStore.actions;

// 异步登录的方法
const fetchLogin = (loginParams) => {
  return async (dispatch) => {
    // 发请求获取token
    const result = await loginAPI(loginParams);
    // 提交同步方法存储token
    dispatch(setToken(result.data.token));
  };
};
// 异步获取用户信息的方法
const fetchUserInfo = () => {
  return async (dispatch) => {
    const result = await getUserInfoAPI();
    // 将用户信息存储到仓库中
    dispatch(setUserInfo(result.data));
  };
};

// 暴露actionCreater
export { fetchLogin, fetchUserInfo, clearUserInfo };

// 获取reducer函数并导出
const reducer = userStore.reducer;
export default reducer;
